<?php

	class FormValidator
	{	
		//Error array
		private $errors = array();
		
		//Regulljära uttryck
		private $username_regex = "/^[a-zåäöA-ZÅÄÖ0-9]+$/";	//0-9 & Aa-Öö
		private $password_regex = "/^[a-zåäöA-ZÅÄÖ0-9]+$/";  //0-9 & Aa-Öö
		private $social_nr_regex = array(
	        "/^[0-9]{2}(0[1-9])|(1[0-2])([0-2][0-9])|(3[0-1])[0-9]{4}$/",        //ÅÅMMDDXXXX 
	        "/^[0-9]{2}(0[1-9])|(1[0-2])([0-2][0-9])|(3[0-1])-[0-9]{4}$/",       //ÅÅMMDD-XXXX
	        "/^[1-2][0-9]{3}(0[1-9])|(1[0-2])([0-2][0-9])|(3[0-1])[0-9]{4}$/",   //ÅÅÅÅMMDDXXXX
	        "/^[1-2][0-9]{3}(0[1-9])|(1[0-2])([0-2][0-9])|(3[0-1])-[0-9]{4}$/"); //ÅÅÅÅMMDD-XXXX		
		private $email_regex = 
		   "/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.(?:[a-zA-Z]{2}|com|org|net|se|nu|museum)$/";	
		private $date_regex = array(
			 "/^\d\d(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])$/",         		//ÅÅMMDD 
             "/^(19|20)\d\d(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])$/",    		//ÅÅÅÅMMDD
             "/^\d\d[-](0[1-9]|1[012])[-](0[1-9]|[12][0-9]|3[01])$/",       	//ÅÅ-MM-DD 
             "/^(19|20)\d\d[-](0[1-9]|1[012])[-](0[1-9]|[12][0-9]|3[01])$/");	//ÅÅÅÅ-MM-DD)
		
		
		//Konstanter
		const INVALID_USERNAME = "FEL: Användarnamnet får endast innehålla bokstäver och siffror";
		const INVALID_USERNAME_NO_INPUT = "FEL: Du måste ange ett användarnamn.";
		const INVALID_USERNAME_TOO_SHORT = "FEL: Användarnamnet är för kort.";
		const INVALID_USERNAME_TOO_LONG = "FEL: Användarnamnet är för långt.";
		const INVALID_PW = "FEL: Felaktiga tecken för lösenord.";		
		const INVALID_PW_NO_INPUT = "FEL: Du måste ange et lösenord.";
		const INVALID_PW_TOO_SHORT = "FEL: Lösenordet måste bestå av minst 6 tecken";
		const INVALID_PW_TOO_LONG = "FEL: Lösenordet är för långt";
		const INVALID_SOCIAL_NR = "FEL: Personnummret måste anges enligt: XXXXXX-XXXX, XXXXXXXXXX, XXXXXXXX-XXXX eller XXXXXXXXXXXX";
		const INVALID_EMAIL_NO_INPUT = "FEL: Du måste ange en email.";
		const INVALID_EMAIL = "FEL: Felaktig e-post adress.";
		const INVALID_DATE = "FEL: Du måste ange datum enligt: 1999-10-01, 99-10-01 eller 991001.";	
		const INVALID_STRING = "Fel: Du har angett en ogiltig text-sträng.";						   
		
		//Retunerar TRUE om en inputsträng inte har något värde.
		public function NoInputCheck($input)
		{
			if(empty($input) == TRUE)//Ret TRUE om strängen inte har ett innehåll
			{
				return TRUE;
			}
			return FALSE;
		}	
	
		//Validerar användarnamne
		public function ValidateUsername($username)
		{
			if($this->NoInputCheck($username) == TRUE)
			{
				$this->errors[] = FormValidator::INVALID_USERNAME_NO_INPUT;
				return FALSE;
			}
			
			if(strlen($username) < 4)
			{
				$this->errors[] = FormValidator::INVALID_PW_TOO_SHORT;	
				return FALSE;	
			}	
			
			if(strlen($username) > 15)
			{
				$this->errors[] = FormValidator::INVALID_USERNAME_TOO_LONG;	
				return FALSE;					
			}		
			
			if(preg_match($this->username_regex, $username) == FALSE)
			{
				$this->errors[] = FormValidator::INVALID_USERNAME;
				return FALSE;					
			}	
			
			return TRUE;						
		}
		
		//Validerar lösenord
		public function ValidatePassword($password)
		{
			if($this->NoInputCheck($password) == TRUE)
			{
				$this->errors[] = FormValidator::INVALID_PW_NO_INPUT;
				return FALSE;					
			}	

			if(strlen($password) < 6)
			{
				$this->errors[] = FormValidator::INVALID_PW_TOO_SHORT;		
				return FALSE;				
			}		
			
			if(strlen($password) > 15)
			{
				$this->errors[] = FormValidator::INVALID_PW_TOO_LONG;		
				return FALSE;				
			}	

			if(preg_match($this->password_regex, $password) == FALSE)
			{
				$this->errors[] = FormValidator::INVALID_PW;		
				return FALSE;				
			}	
			
			return TRUE;																
		}	
		
		//Validerar email
		public function ValidateEmail($email)
		{
	  		if($this->NoInputCheck($email) == TRUE)
			{
			  	$this->errors[] = FormValidator::INVALID_EMAIL_NO_INPUT;
				return FALSE;				
			} 
			  
			if(preg_match($this->email_regex, $email) == FALSE)
			{
				$this->errors[] = FormValidator::INVALID_EMAIL;			
				return FALSE;			 	
			}	
			  
			return TRUE;
		}
		
		//Validerar datum
		public function ValidateDate($date)
		{
			for($i = 0; $i <= 3; $i++)
			{
				if(preg_match($this->date_regex[$i], $date))
				{
					$date = $this->StandardDate($date);
					echo $date . "<br/>";
					return TRUE;
				}
			}
			$this->errors[] = FormValidator::INVALID_DATE;
			return FALSE;
		}
		
		//Gör om alla godkända datum till ett standardformat
		public function StandardDate($date)
		{
			$date = str_replace("-", "", "$date");
			if(strlen($date) != 6)
			{
				$date = substr($date, 2);
			}
			return $date;
		}
		
		//Validerar personnummer
		public function ValidateSocialnumber($socialnumber)
		{
			for($i = 0; $i <= 3; $i++)
			{
				if(preg_match($this->social_nr_regex[$i], $socialnumber))
				{
					$socialnumber = $this->StandardSocialnumber($socialnumber);
					echo $socialnumber . "<br/>";
					return TRUE;
				}
			}
			$this->errors[] = FormValidator::INVALID_SOCIAL_NR;
			return FALSE;
		}
		
		//Gör om alla godkända personnummer till ett standardformat
		public function StandardSocialnumber($socialnumber)
		{
			$socialnumber = str_replace("-", "", "$socialnumber");
			if(strlen($socialnumber) != 10)
			{
				$socialnumber = substr($socialnumber, 2);
			}
			return $socialnumber;
		}		

		//Retunerar FALSE om en sträng innehåller javaScript
		public function StringValidationScript($string)
		{
		  if(preg_match($this->no_script, $string))
		  {
		   $this->errors = FormValidator::INVALID_STRING;
		   return FALSE;
		  }
		  return TRUE;
		}
		
		//TESTFUNKTION
		public function Test()
		
		{
			//TESTAR ANVÄNDARNAMN ------------------------------------------------------------
								  	
		    if($this->ValidateUsername("Örjan") != TRUE)
		    {
		   		echo "Fel - Korrekt anv-namn 1 godkändes ej";
		     	return FALSE;
		    }
		  
		    if($this->ValidateUsername("Örjan1234") != TRUE)
		    {
		   		echo "Fel - Korrekt anv-namn 2 godkändes ej";
		     	return FALSE;
		    }
		  
		    if($this->ValidateUsername("") == TRUE)
		    {
		     	echo "Fel - Tomt anv-namn godkändes";
		     	return FALSE;
		    }
			
		    if($this->ValidateUsername("&%¤/&!") == TRUE)
		    {
		     	echo "Fel - Felaktiga tecken användes för anv-namn";
		     	return FALSE;
		    }	
			
			//TESTAR LÖSENORD -----------------------------------------------------------					

		    if($this->ValidatePassword("") == TRUE)
		    {
		     	echo "Fel - Tomt lösenord godkändes";
		    	return FALSE;
		    }
		  
		    if($this->ValidatePassword("passwörd") != TRUE)
		    {
		     	echo "Fel - Korrekt lösenord 1 godkändes ej";
		    	return FALSE;
		    }
		  
		    if($this->ValidatePassword("passwörd123") != TRUE)
		    {
		     	echo "Fel - Korrekt lösenord 2 godkändes ej";
		     	return FALSE;
		    }
		  
		    if($this->ValidatePassword("_(%¤##¤%&¤%/%/") == TRUE)
		    {
		     	echo "Fel - Felaktigt lösenord godkändes";
		     	return FALSE;
		    }

			//TESTAR EMAIL ------------------------------------------------------------			
		   
		    if($this->ValidateEmail("gurra@domain.se") != TRUE)
		    {
			    echo "Fel - Rätt email 1 godkändes ej";
			    return FALSE;
		    }
		  
		    if($this->ValidateEmail("gurra.bjork1@lnu.se") != TRUE)
		    {
			    echo "Fel - Rätt email 2 godkändes ej";
		    	return FALSE;
		    }
		  
		    if($this->ValidateEmail("adam.123@lnu.banan") == TRUE)
		    {
			    echo "Fel - Fel email 1 godkändes";
		     	return FALSE;
		    }
			
		    if($this->ValidateEmail("adam.åäö@lnu.se") == TRUE)
		    {
			    echo "Fel - Fel email 2 godkändes";
		     	return FALSE;
		    }			
		  
		    if($this->ValidateEmail("") == TRUE)
		    {
			   	echo "Fel - ValidateEmail - Ingen indata";
			   	return FALSE;
		    }
			
			//TESTAR PERSONNUMMER ------------------------------------------------------------			
			
			if($this->ValidateSocialnumber("8302042972") != TRUE)
			{
				echo "Fel -Godkänt perssonnummer 1 godkändes ej";
				return FALSE;
			}
			
			if($this->ValidateSocialnumber("821004-2982") != TRUE)
			{
				echo "Fel -Godkänt perssonnummer 2 godkändes ej";
				return FALSE;
			}
			
			if($this->ValidateSocialnumber("198512043982") != TRUE)
			{
				echo "Fel -Godkänt perssonnummer 3 godkändes ej";
				return FALSE;
			}
			
			if($this->ValidateSocialnumber("19851203-2982") != TRUE)
			{
				echo "Fel -Godkänt perssonnummer 4 godkändes ej";
				return FALSE;
			}
			
			if($this->ValidateSocialnumber("dettaskaintefunka") == TRUE)
			{
				echo "Fel - Fel perssonnummer godkändes";
				return FALSE;
			}
			
			//TESTAR DATUM ------------------------------------------------------------			
			
			if($this->ValidateDate("19990102") != TRUE)
      		{
         		echo "Fel -Godkänt datum 1 godkändes ej"; 
      			return FALSE;         
		    }
		     
		    if($this->ValidateDate("2001-05-12") != TRUE)
		    {
         		echo "Fel -Godkänt datum 2 godkändes ej"; 
		    	return FALSE;      
		    }
		
		    if($this->ValidateDate("05-12-01") != TRUE)
		    {
		    	echo "Fel -Godkänt datum 3 godkändes ej"; 
		    	return FALSE;      
		    }            
		    
		    if($this->ValidateDate("071115") != TRUE)
		    {
		    	echo "Fel -Godkänt datum 4 godkändes ej"; 
		    	return FALSE;      
		    }
			
			if($this->ValidateDate("20121444") == TRUE)
		    {
		    	echo "Fel - Fel datum godkändes"; 
		    	return FALSE;     
		    }
		  
		 	echo "Test Lyckades - FormValidator";
		  
		    return TRUE;
		}		
		
	}                
        
?>